<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>运行测试</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="regress.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="regress.html">快退</a></td><td width="60%" align="center" valign="bottom">章28. 回归测试</td><td width="10%" align="right" valign="top"><a href="regress.html">快进</a></td><td width="10%" align="right" valign="top"><a href="regress-evaluation.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="REGRESS-RUN">28.1. 运行测试</a></h1>
<p>回归测试可以对一套已经安装好并且在运行中的服务器进行测试，也可以对编译树里面即将安装的服务器进行测试。详细些说，有"并行"和"串行"运行测试之分。串行模式顺序运行每个测试，而并行模式启动多个服务器进程，并发地运行一组测试。并发测试使我们对进程内部通讯和锁的正确工作有足够的信心。由于历史原因，串行测试通常对一个现存的安装进行测试，而并发测试是"独立"的，不过这么做没有什么技术原因。</p>
<p>编译之后和安装之前运行回归测试，你可以在顶级目录运行(或者进入 <tt class="FILENAME">src/test/regress</tt> 子目录然后在那里运行)：</p>
<pre class="SCREEN">gmake check</pre>
<p>这样将先编译几个辅助文件，比如一些用户定义的触发器函数，然后再运行测试驱动脚本。最后你会看到类似下面的东西</p>
<pre class="SCREEN"><samp class="COMPUTEROUTPUT">======================
 All 100 tests passed.
======================</samp></pre>
<p>或者是一些关于某项测试失败的信息。先看看<a href="regress-evaluation.html">节28.2</a>然后再想想一个"失败"是否代表严重的错误。</p>
<p>因为这个测试方法运行临时的服务器，所以如果你是 root 用户，那这个方法不能运行(服务器不能以 root 身份启动)。如果你已经以 root 身份编译了，你就什么也干不了。这时候你应该把测试目录的权限变成某个用户可写，然后以那个用户身份登陆，再开始测试。比如</p>
<pre class="SCREEN"><samp class="PROMPT">root# </samp><kbd class="USERINPUT">chmod -R a+w src/test/regress</kbd>
<samp class="PROMPT">root# </samp><kbd class="USERINPUT">chmod -R a+w contrib/spi</kbd>
<samp class="PROMPT">root# </samp><kbd class="USERINPUT">su - joeuser</kbd>
<samp class="PROMPT">joeuser$ </samp><kbd class="USERINPUT">cd <tt class="REPLACEABLE"><i>top-level build directory</i></tt></kbd>
<samp class="PROMPT">joeuser$ </samp><kbd class="USERINPUT">gmake check</kbd></pre>
<p>这里唯一可能的"安全隐患"就是那个用户可能会背着你修改回归测试的结果。用你的常识管理用户权限。</p>
<p>如果不是上面那样，安装后就可以运行测试。</p>
<p>如果你配置 PostgreSQL 安装到一个原来安装有老版本 PostgreSQL 的目录里，然后在安装新版本之前执行 <tt class="LITERAL">gmake check</tt> ，那么你可能发现测试失败，因为新程序试图使用已经存在的共享库，典型的症状是抱怨未定义的符号。如果你想在覆盖老版本之前运行测试，那么你需要使用 <tt class="LITERAL">configure --disable-rpath</tt> 进行编译。不过，我们不建议你使用这个选项编译作为最终安装的数据库。</p>
<p>并发的回归测试会在你的用户 ID 下启动相当多的进程。目前，最大的并发数是 20 个并发测试脚本，这意味着 40 个进程：一个服务器进程、每个脚本一个 <span class="APPLICATION">psql</span> 进程。因此，如果你的系统有针对每个用户的进程数限制，那么请确保这个限制至少是 50 ，否则你就可能在并发测试时看到随机出现的失败。如果你没有办法提升该限制，那么可以通过设置 <tt class="LITERAL">MAX_CONNECTIONS</tt> 参数降低并发测试程度。比如</p>
<pre class="SCREEN">gmake MAX_CONNECTIONS=10 check</pre>
<p>将运行最多不超过 10 个并发进程。</p>
<p>安装后(参见<a href="installation.html">章14</a>)运行测试，像<a href="runtime.html">章16</a>描述的那样初始化一个数据区并启动服务器，然后键入</p>
<pre class="SCREEN">gmake installcheck</pre>
<p>或者是运行一个并发测试</p>
<pre class="SCREEN">gmake installcheck-parallel</pre>
<p>该测试将与在本地主机和缺省端口号上运行的服务器进行连接，除非你用 <tt class="ENVAR">PGHOST</tt> 和 <tt class="ENVAR">PGPORT</tt> 环境变量设置为其它值。</p>
<p>源代码发布还包含给可选的过程语言和 <tt class="FILENAME">contrib</tt> 模块使用的回归测试。目前，这些测试只能用于已经安装的服务器。要给所有编译并安装的过程语言运行测试，我们可以进入源代码树的 <tt class="FILENAME">src/pl</tt> 目录然后运行</p>
<pre class="SCREEN">gmake installcheck</pre>
<p>你还可以在 <tt class="FILENAME">src/pl</tt> 的任何子目录里只针对一种过程语言进行测试。要为所有 <tt class="FILENAME">contrib</tt> 模块运行测试，必须首先编译并安装 <tt class="FILENAME">contrib</tt> 模块，然后进入 <tt class="FILENAME">contrib</tt> 目录运行</p>
<pre class="SCREEN">gmake installcheck</pre>
<p>你也可以在 <tt class="FILENAME">contrib</tt> 的子目录里只针对一个模块运行测试。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="regress.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="regress-evaluation.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">回归测试</td><td width="34%" align="center" valign="top"><a href="regress.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">测试评估</td></tr>
</table>
</div>
</body></html>